{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "7ecc7207",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-09-07T07:15:41.116635Z",
     "start_time": "2021-09-07T07:15:33.214467Z"
    }
   },
   "outputs": [],
   "source": [
    "from autogluon.tabular import TabularDataset, TabularPredictor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "3206b339",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-09-07T07:16:03.325007Z",
     "start_time": "2021-09-07T07:16:03.321344Z"
    }
   },
   "outputs": [],
   "source": [
    "data_name = 'kaggle_springleaf'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "4a392ef1",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-09-07T07:16:03.611755Z",
     "start_time": "2021-09-07T07:16:03.605439Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['sample_submission.csv', 'train.csv', 'test.csv']"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import os\n",
    "os.listdir(f'../autox/data/{data_name}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "6bc8546b",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-09-07T07:17:12.748653Z",
     "start_time": "2021-09-07T07:16:16.270872Z"
    },
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "train_data = TabularDataset(f'../autox/data/{data_name}/train.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "21370fd8",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-09-07T07:17:12.755226Z",
     "start_time": "2021-09-07T07:17:12.750995Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(145231, 1934)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "4ba99057",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-09-07T07:17:12.800082Z",
     "start_time": "2021-09-07T07:17:12.757227Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>ID</th>\n",
       "      <th>VAR_0001</th>\n",
       "      <th>VAR_0002</th>\n",
       "      <th>VAR_0003</th>\n",
       "      <th>VAR_0004</th>\n",
       "      <th>VAR_0005</th>\n",
       "      <th>VAR_0006</th>\n",
       "      <th>VAR_0007</th>\n",
       "      <th>VAR_0008</th>\n",
       "      <th>VAR_0009</th>\n",
       "      <th>...</th>\n",
       "      <th>VAR_1926</th>\n",
       "      <th>VAR_1927</th>\n",
       "      <th>VAR_1928</th>\n",
       "      <th>VAR_1929</th>\n",
       "      <th>VAR_1930</th>\n",
       "      <th>VAR_1931</th>\n",
       "      <th>VAR_1932</th>\n",
       "      <th>VAR_1933</th>\n",
       "      <th>VAR_1934</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>H</td>\n",
       "      <td>224</td>\n",
       "      <td>0</td>\n",
       "      <td>4300</td>\n",
       "      <td>C</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>98</td>\n",
       "      <td>98</td>\n",
       "      <td>998</td>\n",
       "      <td>999999998</td>\n",
       "      <td>998</td>\n",
       "      <td>998</td>\n",
       "      <td>9998</td>\n",
       "      <td>9998</td>\n",
       "      <td>IAPS</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4</td>\n",
       "      <td>H</td>\n",
       "      <td>7</td>\n",
       "      <td>53</td>\n",
       "      <td>4448</td>\n",
       "      <td>B</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>98</td>\n",
       "      <td>98</td>\n",
       "      <td>998</td>\n",
       "      <td>999999998</td>\n",
       "      <td>998</td>\n",
       "      <td>998</td>\n",
       "      <td>9998</td>\n",
       "      <td>9998</td>\n",
       "      <td>IAPS</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>5</td>\n",
       "      <td>H</td>\n",
       "      <td>116</td>\n",
       "      <td>3</td>\n",
       "      <td>3464</td>\n",
       "      <td>C</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>98</td>\n",
       "      <td>98</td>\n",
       "      <td>998</td>\n",
       "      <td>999999998</td>\n",
       "      <td>998</td>\n",
       "      <td>998</td>\n",
       "      <td>9998</td>\n",
       "      <td>9998</td>\n",
       "      <td>IAPS</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>7</td>\n",
       "      <td>H</td>\n",
       "      <td>240</td>\n",
       "      <td>300</td>\n",
       "      <td>3200</td>\n",
       "      <td>C</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>98</td>\n",
       "      <td>98</td>\n",
       "      <td>998</td>\n",
       "      <td>999999998</td>\n",
       "      <td>998</td>\n",
       "      <td>998</td>\n",
       "      <td>9998</td>\n",
       "      <td>9998</td>\n",
       "      <td>RCC</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>R</td>\n",
       "      <td>72</td>\n",
       "      <td>261</td>\n",
       "      <td>2000</td>\n",
       "      <td>N</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>...</td>\n",
       "      <td>98</td>\n",
       "      <td>98</td>\n",
       "      <td>998</td>\n",
       "      <td>999999998</td>\n",
       "      <td>998</td>\n",
       "      <td>998</td>\n",
       "      <td>9998</td>\n",
       "      <td>9998</td>\n",
       "      <td>BRANCH</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 1934 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   ID VAR_0001  VAR_0002  VAR_0003  VAR_0004 VAR_0005  VAR_0006  VAR_0007  \\\n",
       "0   2        H       224         0      4300        C       0.0       0.0   \n",
       "1   4        H         7        53      4448        B       1.0       0.0   \n",
       "2   5        H       116         3      3464        C       0.0       0.0   \n",
       "3   7        H       240       300      3200        C       0.0       0.0   \n",
       "4   8        R        72       261      2000        N       0.0       0.0   \n",
       "\n",
       "  VAR_0008 VAR_0009  ... VAR_1926 VAR_1927 VAR_1928   VAR_1929  VAR_1930  \\\n",
       "0    False    False  ...       98       98      998  999999998       998   \n",
       "1    False    False  ...       98       98      998  999999998       998   \n",
       "2    False    False  ...       98       98      998  999999998       998   \n",
       "3    False    False  ...       98       98      998  999999998       998   \n",
       "4    False    False  ...       98       98      998  999999998       998   \n",
       "\n",
       "   VAR_1931  VAR_1932  VAR_1933  VAR_1934  target  \n",
       "0       998      9998      9998      IAPS       0  \n",
       "1       998      9998      9998      IAPS       0  \n",
       "2       998      9998      9998      IAPS       0  \n",
       "3       998      9998      9998       RCC       0  \n",
       "4       998      9998      9998    BRANCH       1  \n",
       "\n",
       "[5 rows x 1934 columns]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "ec3eacc4",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-09-07T07:17:12.804785Z",
     "start_time": "2021-09-07T07:17:12.801684Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/caihengxing/anaconda3/envs/python37/lib/python3.7/site-packages/ipykernel/ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
      "  and should_run_async(code)\n"
     ]
    }
   ],
   "source": [
    "label = 'target'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "a225cdb6",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-09-07T08:00:28.265911Z",
     "start_time": "2021-09-07T07:17:12.806437Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Warning: Training may take a very long time because `time_limit` was not specified and `train_data` is large (145231 samples, 2534.01 MB).\n",
      "\tConsider setting `time_limit` to ensure training finishes within an expected duration or experiment with a small portion of `train_data` to identify an ideal `presets` and `hyperparameters` configuration.\n",
      "Beginning AutoGluon training ...\n",
      "AutoGluon will save models to \"agModels-kaggle_springleaf/\"\n",
      "AutoGluon Version:  0.2.1b20210716\n",
      "Train Data Rows:    145231\n",
      "Train Data Columns: 1933\n",
      "Preprocessing data ...\n",
      "AutoGluon infers your prediction problem is: 'binary' (because only two unique label-values observed).\n",
      "\t2 unique label values:  [0, 1]\n",
      "\tIf 'binary' is not the correct problem_type, please manually specify the problem_type argument in fit() (You may specify problem_type as one of: ['binary', 'multiclass', 'regression'])\n",
      "Selected class <--> label mapping:  class 1 = 1, class 0 = 0\n",
      "Using Feature Generators to preprocess the data ...\n",
      "Fitting AutoMLPipelineFeatureGenerator...\n",
      "\tAvailable Memory:                    251053.2 MB\n",
      "\tTrain Data (Original)  Memory Usage: 2532.85 MB (1.0% of available memory)\n",
      "\tInferring data type of each feature based on column values. Set feature_metadata_in to manually specify special dtypes of the features.\n",
      "\tStage 1 Generators:\n",
      "\t\tFitting AsTypeFeatureGenerator...\n",
      "\tStage 2 Generators:\n",
      "\t\tFitting FillNaFeatureGenerator...\n",
      "\tStage 3 Generators:\n",
      "\t\tFitting IdentityFeatureGenerator...\n",
      "\t\tFitting CategoryFeatureGenerator...\n",
      "\t\t\tFitting CategoryMemoryMinimizeFeatureGenerator...\n",
      "\tStage 4 Generators:\n",
      "\t\tFitting DropUniqueFeatureGenerator...\n",
      "\tUseless Original Features (Count: 5): ['VAR_0207', 'VAR_0213', 'VAR_0840', 'VAR_0847', 'VAR_1428']\n",
      "\t\tThese features carry no predictive signal and should be manually investigated.\n",
      "\t\tThis is typically a feature which has the same value for all rows.\n",
      "\t\tThese features do not need to be present at inference time.\n",
      "\tTypes of features in original data (raw dtype, special dtypes):\n",
      "\t\t('float', [])  :  474 | ['VAR_0006', 'VAR_0007', 'VAR_0013', 'VAR_0014', 'VAR_0015', ...]\n",
      "\t\t('int', [])    : 1403 | ['ID', 'VAR_0002', 'VAR_0003', 'VAR_0004', 'VAR_0532', ...]\n",
      "\t\t('object', []) :   51 | ['VAR_0001', 'VAR_0005', 'VAR_0008', 'VAR_0009', 'VAR_0010', ...]\n",
      "\tTypes of features in processed data (raw dtype, special dtypes):\n",
      "\t\t('category', []) :   51 | ['VAR_0001', 'VAR_0005', 'VAR_0008', 'VAR_0009', 'VAR_0010', ...]\n",
      "\t\t('float', [])    :  474 | ['VAR_0006', 'VAR_0007', 'VAR_0013', 'VAR_0014', 'VAR_0015', ...]\n",
      "\t\t('int', [])      : 1403 | ['ID', 'VAR_0002', 'VAR_0003', 'VAR_0004', 'VAR_0532', ...]\n",
      "\t29.8s = Fit runtime\n",
      "\t1928 features in original data used to generate 1928 features in processed data.\n",
      "\tTrain Data (Processed) Memory Usage: 2190.98 MB (0.9% of available memory)\n",
      "Data preprocessing and feature engineering runtime = 36.26s ...\n",
      "AutoGluon will gauge predictive performance using evaluation metric: 'accuracy'\n",
      "\tTo change this, specify the eval_metric argument of fit()\n",
      "Automatically generating train/validation split with holdout_frac=0.017213955698163617, Train Rows: 142731, Val Rows: 2500\n",
      "Fitting 13 L1 models ...\n",
      "Fitting model: KNeighborsUnif ...\n",
      "\t0.7308\t = Validation accuracy score\n",
      "\t9.77s\t = Training runtime\n",
      "\t47.12s\t = Validation runtime\n",
      "Fitting model: KNeighborsDist ...\n",
      "\t0.7332\t = Validation accuracy score\n",
      "\t10.43s\t = Training runtime\n",
      "\t40.75s\t = Validation runtime\n",
      "Fitting model: LightGBMXT ...\n",
      "\t0.7676\t = Validation accuracy score\n",
      "\t37.04s\t = Training runtime\n",
      "\t0.12s\t = Validation runtime\n",
      "Fitting model: LightGBM ...\n",
      "\t0.7676\t = Validation accuracy score\n",
      "\t35.54s\t = Training runtime\n",
      "\t0.15s\t = Validation runtime\n",
      "Fitting model: RandomForestGini ...\n",
      "\t0.8048\t = Validation accuracy score\n",
      "\t57.14s\t = Training runtime\n",
      "\t0.33s\t = Validation runtime\n",
      "Fitting model: RandomForestEntr ...\n",
      "\t0.8004\t = Validation accuracy score\n",
      "\t57.5s\t = Training runtime\n",
      "\t0.3s\t = Validation runtime\n",
      "Fitting model: CatBoost ...\n",
      "\t0.784\t = Validation accuracy score\n",
      "\t14.99s\t = Training runtime\n",
      "\t0.23s\t = Validation runtime\n",
      "Fitting model: ExtraTreesGini ...\n",
      "\t0.7968\t = Validation accuracy score\n",
      "\t42.49s\t = Training runtime\n",
      "\t0.43s\t = Validation runtime\n",
      "Fitting model: ExtraTreesEntr ...\n",
      "\t0.7956\t = Validation accuracy score\n",
      "\t40.03s\t = Training runtime\n",
      "\t0.4s\t = Validation runtime\n",
      "Fitting model: NeuralNetFastAI ...\n",
      "/home/caihengxing/anaconda3/envs/python37/lib/python3.7/site-packages/torch/cuda/__init__.py:52: UserWarning: CUDA initialization: The NVIDIA driver on your system is too old (found version 10010). Please update your GPU driver by downloading and installing a new version from the URL: http://www.nvidia.com/Download/index.aspx Alternatively, go to: https://pytorch.org to install a PyTorch version that has been compiled with your version of the CUDA driver. (Triggered internally at  /pytorch/c10/cuda/CUDAFunctions.cpp:115.)\n",
      "  return torch._C._cuda_getDeviceCount() > 0\n",
      "No improvement since epoch 3: early stopping\n",
      "\t0.804\t = Validation accuracy score\n",
      "\t1139.28s\t = Training runtime\n",
      "\t5.66s\t = Validation runtime\n",
      "Fitting model: XGBoost ...\n",
      "/home/caihengxing/anaconda3/envs/python37/lib/python3.7/site-packages/xgboost/core.py:104: UserWarning: ntree_limit is deprecated, use `iteration_range` or model slicing instead.\n",
      "  UserWarning\n",
      "\t0.794\t = Validation accuracy score\n",
      "\t86.08s\t = Training runtime\n",
      "\t0.44s\t = Validation runtime\n",
      "Fitting model: NeuralNetMXNet ...\n",
      "\t0.7992\t = Validation accuracy score\n",
      "\t774.68s\t = Training runtime\n",
      "\t3.3s\t = Validation runtime\n",
      "Fitting model: LightGBMLarge ...\n",
      "\t0.7676\t = Validation accuracy score\n",
      "\t38.94s\t = Training runtime\n",
      "\t0.15s\t = Validation runtime\n",
      "/home/caihengxing/anaconda3/envs/python37/lib/python3.7/site-packages/xgboost/core.py:104: UserWarning: ntree_limit is deprecated, use `iteration_range` or model slicing instead.\n",
      "  UserWarning\n",
      "Fitting model: WeightedEnsemble_L2 ...\n",
      "\t0.8132\t = Validation accuracy score\n",
      "\t1.78s\t = Training runtime\n",
      "\t0.01s\t = Validation runtime\n",
      "AutoGluon training complete, total runtime = 2594.9s ...\n",
      "TabularPredictor saved. To load, use: predictor = TabularPredictor.load(\"agModels-kaggle_springleaf/\")\n"
     ]
    }
   ],
   "source": [
    "save_path = f'agModels-{data_name}'  # specifies folder to store trained models\n",
    "predictor = TabularPredictor(label=label, path=save_path).fit(train_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "fa84c4eb",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-09-07T08:01:14.409990Z",
     "start_time": "2021-09-07T08:00:28.268113Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/caihengxing/anaconda3/envs/python37/lib/python3.7/site-packages/ipykernel/ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
      "  and should_run_async(code)\n",
      "Loaded data from: ../autox/data/kaggle_springleaf/test.csv | Columns = 1933 / 1933 | Rows = 145232 -> 145232\n"
     ]
    }
   ],
   "source": [
    "test_data_nolab = TabularDataset(f'../autox/data/{data_name}/test.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "54cce4ce",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-09-07T08:16:25.488272Z",
     "start_time": "2021-09-07T08:01:14.412277Z"
    }
   },
   "outputs": [],
   "source": [
    "y_pred = predictor.predict(test_data_nolab)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "ca6cc9bf",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-09-07T08:16:25.497937Z",
     "start_time": "2021-09-07T08:16:25.490484Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/caihengxing/anaconda3/envs/python37/lib/python3.7/site-packages/ipykernel/ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
      "  and should_run_async(code)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0         0\n",
       "1         0\n",
       "2         0\n",
       "3         0\n",
       "4         1\n",
       "         ..\n",
       "145227    0\n",
       "145228    0\n",
       "145229    0\n",
       "145230    0\n",
       "145231    0\n",
       "Name: target, Length: 145232, dtype: int64"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "240cd16c",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-09-07T09:07:39.771342Z",
     "start_time": "2021-09-07T09:07:39.766489Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/caihengxing/anaconda3/envs/python37/lib/python3.7/site-packages/ipykernel/ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
      "  and should_run_async(code)\n"
     ]
    }
   ],
   "source": [
    "id_ = ['ID']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "b4fd354e",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-09-07T09:07:41.897450Z",
     "start_time": "2021-09-07T09:07:41.801691Z"
    },
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "sub = test_data_nolab[id_].copy()\n",
    "sub[label] = list(y_pred.values)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "c59b336a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2021-09-07T09:07:43.272016Z",
     "start_time": "2021-09-07T09:07:43.029438Z"
    }
   },
   "outputs": [],
   "source": [
    "sub.to_csv(f\"./sub/autogluon_sub_{data_name}.csv\", index = False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c43926aa",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6b54628e",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.10"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
